package com.lm.service.impl;

import com.lm.mapper.ContractMapper;
import com.lm.pojo.Sign;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

@Service
public class ContractTimerService {

    // 注入 SignMapper（@Resource 或 @Autowired 均可）
    @Resource
    private ContractMapper contractMapper;

    @Scheduled(cron = "0 */1 * * * ?")    //0 */1 * * * ? (一分钟自动更新一次)  0 0 2 * * ?(每天两点更新)
    @Transactional  // 事务注解：确保批量更新要么全成功，要么全失败（避免部分更新导致数据不一致）
    public void autoUpdateSignStatus() {
        try {
            // 步骤 1：查询待处理的签约记录（如 status=0 表示“待审核”，需与业务定义一致）
            List<Sign> pendingSignList = contractMapper.selectByStatus(2);
            if (pendingSignList.isEmpty()) {
                System.out.println("无待处理的签约记录，无需更新");
                return;
            }

            // 步骤 2：遍历待处理记录，按时间对比设置新状态
            Date currentTime = new Date();  // 后端统一获取当前时间，避免前端篡改
            List<Sign> updateList = new ArrayList<>();  // 存储待更新的记录



            for (Sign sign : pendingSignList) {
                Integer newStatus;
                char c = sign.getServicePackageDuration().charAt(0);
                Integer integer = c - '0';
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(sign.getSignApplyTime());
                calendar.add(Calendar.YEAR,integer);
                Date date1 =sign.getSignApplyTime();
                Date date2 =calendar.getTime();
                if (currentTime.after(date1)){
                    if (currentTime.after(date2)){
                        newStatus = 4;  // 已过期
                    }else {
                        newStatus = 3;  //已生效
                    }
                } else {
                    newStatus = 2;  // 待生效
                }

                // 若状态无变化，跳过（避免无效更新）
                if (newStatus.equals(sign.getSignStatus())) {
                    continue;
                }

                // 给 Sign 对象赋值新状态和更新时间
                sign.setSignStatus(newStatus);
                updateList.add(sign);  // 加入待更新列表
            }

            // 步骤 3：批量更新数据库（若待更新列表为空，跳过）
            if (!updateList.isEmpty()) {
                int affectedRows = contractMapper.batchUpdateById(updateList);
                System.out.println("批量更新成功，受影响行数：" + affectedRows);
            } else {
                System.out.println("待更新列表为空，无需执行数据库操作");
            }

        } catch (Exception e) {
            // 异常处理：打印日志 + 抛出异常（事务会自动回滚）
            throw new RuntimeException("批量更新状态异常", e);
        }
    }
}